package DAOHibernate;

import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import DAO.UsuarioDAO;
import acceso.EMF;
import modelo.Usuario;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class UsuarioDAOhiberjpa implements UsuarioDAO {
	private static EntityManagerFactory emf = Persistence
			.createEntityManagerFactory("base-ttps-final");
	private Usuario user = new Usuario();

	public Usuario encontrar(String name, String clave) {

		EntityManager em = EMF.getEMF().createEntityManager();
		String qString = "from Usuario u where u.name = :name and u.clave = :clave";
		@SuppressWarnings("unchecked")
		List<Usuario> listaObj = (List<Usuario>) em.createQuery(qString)
				.setParameter("name", name).setParameter("clave", clave)
				.getResultList();
		Iterator<Usuario> it = listaObj.iterator();
		if (it.hasNext()) {
			Usuario user = it.next();
			return user;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listar(int from, int to, String criterio, String orden) {
		List<Usuario> resultado;

		String sord = "desc";
		if (orden != null && !orden.equals(""))
			sord = orden;

		// order by por defecto: nombre desc
		String stringOrderBy = "name " + sord;

		if (criterio != null && !criterio.equals(""))
			stringOrderBy = criterio + " " + sord + ", " + stringOrderBy;

		EntityManager em = UsuarioDAOhiberjpa.emf.createEntityManager();
		Query consulta;
		consulta = em.createQuery("select u from Usuario u order by "
				+ stringOrderBy);

		consulta.setFirstResult(from);
		consulta.setMaxResults(to - from);

		resultado = (List<Usuario>) consulta.getResultList();

		em.close();
		return resultado;
	}

	public int contar() {
		int resultado;
		EntityManager em = UsuarioDAOhiberjpa.emf.createEntityManager();
		Query consulta = em.createQuery("select u from Usuario u");
		resultado = consulta.getResultList().size();
		em.close();
		return resultado;
	}

	@Override
	public void guardar(Usuario user) {
		try {
			EntityManager em = UsuarioDAOhiberjpa.emf.createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			em.persist(user);
			em.flush();
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
	}

	@Override
	public void modificar(Usuario user) {
		// TODO Auto-generated method stub
		try {
			EntityManager em = UsuarioDAOhiberjpa.emf.createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			em.merge(user);
			em.flush();
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
	}

	@Override
	public void eliminar(Usuario user) {
		try {
			EntityManager em = UsuarioDAOhiberjpa.emf.createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			Query consulta = em.createQuery(
					"DELETE FROM Usuario E where E.id=:id").setParameter("id",
					user.getId());
			consulta.executeUpdate();
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}

	}

	@Override
	public Usuario buscarUsuario(long l) {
		Usuario user = null;
		try {
			EntityManager em = UsuarioDAOhiberjpa.emf.createEntityManager();
			user = em.find(Usuario.class, l);

		} catch (Exception e) {
			e.getMessage();
		}
		return user;

	}

	@Override
	public boolean existe(String name) {
		EntityManager em = EMF.getEMF().createEntityManager();
		String qString = "from Usuario u where u.name = :name ";
		int result = em.createQuery(qString).setParameter("name", name)
				.getResultList().size();
		if (result == 0) {
			return false;
		}
		em.close();
		return true;
	}

	@Override
	public Usuario crearUsuario(String name, String clave, String telefono,
			String email, String nombre, String apellido) {
		user.setName(name);
		user.setClave(clave);
		user.setTelefono(telefono);
		user.setEmail(email);
		user.setNombre(nombre);
		user.setApellido(apellido);
		user.setPerfil("usuario");
		return user;
	}

	

}
